/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logic.grafos;

/**
 *
 * @author Jose Gabriel Rivera
 */
public class Grafo implements java.io.Serializable{
    /**
     * Funciona como una lista
     */
    Nodo primero;

      public Grafo(Nodo primero) {
        this.primero = primero;
      }

      public Grafo() {
        this.primero = null;
      }
      
    public Nodo buscarNodo(Object info){
        Nodo nodoAux = this.primero;
        while(!(nodoAux.info.equals(info))){
         
            if(nodoAux==null){
                return null;
            }
            nodoAux = nodoAux.siguiente;
        }       
        return nodoAux;
    }      
  
    /**
     * Añadir un nuevo nodo al final de la lista de nodos,
     */
    public void añadirNodo(Object info){
        Nodo nodoAux = this.primero;
        
        if(this.primero==null){
            this.primero = new Nodo(info);
            return;
        }
        
        while(nodoAux.siguiente!=null){
            nodoAux=nodoAux.siguiente;
        }
        nodoAux.siguiente = new Nodo(info);
      
    }
    
    /**
     * Buscar el nodo, en caso de existir, eliminarlo, gestionar que hacer con las aristas.
     */   
    public boolean eliminarNodo(Object info){
        Nodo nodoAux = this.primero;
      
        if(nodoAux==null)
            return false;
      
        while(nodoAux.siguiente.info != info){
            if(nodoAux.siguiente==null)
                return false;
            nodoAux = nodoAux.siguiente;
        }
        
        nodoAux.siguiente = nodoAux.siguiente.siguiente;
        return true;
    }
    
    /**
     * Buscar el nodo, en caso de existir añadir una arista.
     */    
    public boolean añadirArista(Object info, Object infoArista, int peso){
        
        Nodo nodoAux = buscarNodo(info);
        Nodo nodoAristaAux = buscarNodo(infoArista);
        
        if(nodoAux==null || nodoAristaAux==null){
            return false;
        }  
        
        nodoAux.añadirArista(nodoAristaAux, peso);
        return true;
        
    }
    
    public boolean añadirArista(Object info, Object infoArista, int peso, int auxPeso){
        
        Nodo nodoAux = buscarNodo(info);
        Nodo nodoAristaAux = buscarNodo(infoArista);
        
        if(nodoAux==null || nodoAristaAux==null){
            return false;
        }          
       
        nodoAux.añadirArista(nodoAristaAux, peso, auxPeso);
        return true;
        
    }    
    
    
   /**
    * Buscar la arista, en caso de existir, eliminarla
    */
    public boolean eliminarArista(Object info, Object infoArista, int peso){
        Nodo nodoAux = buscarNodo(info);
        Nodo nodoAristaAux = buscarNodo(infoArista);
        
        if(nodoAux.eliminarArista(nodoAristaAux, peso)){
            return true;
        }else{
            return false;
        }   

    }

}
